#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>

/**
 * TCP: 传输控制协议 安全可靠丢包重传 面向链接（电话模型）
 *      tpc通信流程
 *          服务器 创建流式套接字 绑定 监听 提取 读写 关闭
 *          客户端 创建流式套接字 链接 读写 关闭
 *      收发数据
 *          read
 *              （推荐用 recv） ssize_t recv(int sockfd, void *buf, size_t len, int flags);
 *                  flags 通常填写 0  flags == MSG_PEEK 偷窥，不会删除缓冲区
 *          write
 *              （推荐用 send）ssize_t send(int sockfd, const void *buf, size_t len, int flags);
 *                  flags 通常填写 0 如果 为1 表示紧急数据
 * UDP: 用户数据报协议 不安全不可靠丢包不重传 但是快 不面向链接（邮件模型） 可以在应用层再次进行协议设计来让他安全可靠
 *      udp通信流程
 *          服务器 创建报式套接字 绑定 读写 关闭
 *          客户端 创建报式套接字 读写 关闭
 *      收发数据
 *          recvfrom
 *                      ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
 *                           struct sockaddr *src_addr, socklen_t *addrlen);
 *          sendto
 *                      ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
 *                           const struct sockaddr *dest_addr, socklen_t addrlen);
 *
 * @param argc
 * @param argv
 * @return
 */
int main(int argc,char * argv[]) {

    // 创建报式套接字
    int socket_fd = socket(AF_INET,SOCK_DGRAM,0);
    // 绑定
    struct sockaddr_in myaddr;
    myaddr.sin_family = AF_INET;
    myaddr.sin_port = htons(8888);
    //                         只能用于ip4
    myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");
    int ret = bind(socket_fd,(struct sockaddr *)&myaddr,sizeof(myaddr));
    // 读写
    char buf[1500] = "";
    struct sockaddr_in youraddr;
    socklen_t len = sizeof(youraddr);
    while (1){
        memset(buf,0, sizeof(buf));
        int n = recvfrom(socket_fd,buf, sizeof(buf),0,(struct sockaddr *)&youraddr,&len);
        if(n < 0){
            perror("");
            break;
        }
        else{
            printf("%s",buf);
            sendto(socket_fd,buf,n,0,(struct sockaddr *)&youraddr,len);
        }
    }
    // 关闭
    close(socket_fd);
    return 1;
}

